package list.array;

import list.MyList;

/**
 * Array数组的增删改查
 */
public class MyArrayList<T> implements MyList<T> {
    private Object[] arr=new Object[10];//创建数组
    private int size=0;//长度

    /**
     * 末尾添加值
     * @param data
     * @return
     */
    @Override
    public boolean add(T data) {
        //空间不足?
        if (size>=arr.length){
            Object[] temp=new Object[arr.length*2];
            for (int i = 0; i <size ; i++) {
                temp[i]=arr[i];
            }
            arr=temp;
        }
        arr[size++]=data;
        return true;
    }

    /**
     * 指定索引的位置添加值
     * @param index
     * @param data
     * @return
     */
    @Override
    public boolean add(int index, T data) {
        //索引不再范围内？？
        if (index<0||index>size){
            throw new RuntimeException("索引越界");
        }
        //空间范围不够？？
        if (size>=arr.length){
            Object[] temp=new Object[arr.length*2];
            for (int i = 0; i <arr.length ; i++) {
                temp[i]=arr[i];
            }
            arr=temp;
        }
        //指定索引插入元素
        for (int i = size; i >index ; i--) {
            arr[i]=arr[i-1];
        }
        arr[index]=data;
        size++;
        return true;
    }

    /**
     * 删除制定的值
     * @param data
     * @return
     */
    @Override
    public T remove(T data) {
        T olddata=null;
        for (int i = 0; i <size ; i++) {
            if (data==arr[i]||data.equals(arr[i])){
                olddata= (T) arr[i];
                for (int j = i; j <size-1 ; j++) {
                    arr[j]=arr[j+1];
                }
                break;
            }
        }
        size--;
        return olddata;
    }

    /**
     * 删除指定索引的值
     * @param index
     * @return
     */
    @Override
    public T remove(int index) {
        if (index<0||index>=size){
            throw new RuntimeException("索引越界");
        }
        T oldData= (T) arr[index];
        for (int i = index; i <size-1 ; i++) {
            arr[i]=arr[i+1];
        }
        size--;
        return  oldData;
    }

    @Override
    public boolean set(int index, T data) {
        //索引越界
        if (index<0||index>=size){
            throw new RuntimeException("索引越界");
        }
        //修改该索引的值
        arr[index]=data;

        return true;
    }

    @Override
    public T getValue(int index) {
        //索引越界
        if (index<0||index>=size){
            throw new RuntimeException("索引越界");
        }
        return (T) arr[index];
    }

    @Override
    public int size() {
        return size;
    }
}
